Prepare data

Prevalence


df_ger_prev <- read_csv('Germany_timeseries_prep.csv')

df_ger_prev <- df_ger_prev %>% mutate(date = as.Date(date, "%d%b%Y"),
                                  kreis = as.character(kreis)) %>% 
  dplyr::select(kreis, date, rate_day)

df_ger_prev

Scoial distancing


fb_files <- list.files('../FB Data/GER individual files',
                       '*.csv', full.names = T)

df_ger_socdist <- fb_files %>% 
  map(read.csv) %>% bind_rows()

kreis_match <- read_csv('kreismatch.csv')

df_ger_socdist <- df_ger_socdist %>% 
  select(-polygon_name) %>% 
  plyr::join(kreis_match, by = 'polygon_id') %>%
  select(kreis, ds, all_day_bing_tiles_visited_relative_change,
         all_day_ratio_single_tile_users) %>%
  rename(date = ds,
         socdist_tiles = all_day_bing_tiles_visited_relative_change,
         socdist_single_tile = all_day_ratio_single_tile_users) %>%
  mutate(kreis = as.character(kreis),
         date = as.Date(date)) %>%
  arrange(kreis, date)

df_ger_socdist
NA

Personality


df_ger_pers <- read_csv('Germany_timeseries_prep.csv')

df_ger_pers <- df_ger_pers %>% 
  select(kreis, open, sci, extra, agree, neuro) %>%
  dplyr::rename(pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = neuro) %>%
  distinct() %>%
  mutate(kreis = as.character(kreis))

df_ger_pers
NA

Controls


df_ger_ctrl <- read.csv2('Germany_controls.csv', sep = ';', dec=',')

df_ger_ctrl <- df_ger_ctrl %>% select(-kreis_nme) %>%
    mutate(kreis = as.character(kreis),
           popdens = popdens %>% 
             as.character() %>%
             str_replace('\\.', '')%>%
             as.numeric())

df_ger_ctrl

Merge prevalence data

# create sequence of dates
date_sequence <- seq.Date(min(df_ger_prev$date),
                          max(df_ger_prev$date), 1)
                     
# create data frame with time sequence
df_dates = tibble(date_sequence, 1:length(date_sequence)) 
names(df_dates) <- c('date', 'time')


# merge prevalence data
df_ger_prev <- df_ger_prev %>% 
  inner_join(df_ger_pers, by = 'kreis') %>%
  inner_join(df_ger_ctrl, by = 'kreis') %>%
  merge(df_dates, by='date') %>% 
  arrange(kreis)

df_ger_prev

Merge socdist data


# create sequence of dates
date_sequence <- seq.Date(min(df_ger_socdist$date),
                          max(df_ger_socdist$date), 1)
                     
# create data frame with time sequence
df_dates = tibble(date_sequence, 1:length(date_sequence)) 
names(df_dates) <- c('date', 'time')

# merge socdist data
df_ger_socdist <- df_ger_socdist %>% 
  inner_join(df_ger_pers, by = 'kreis') %>%
  inner_join(df_ger_ctrl, by = 'kreis') %>% 
  merge(df_dates, by='date') %>% 
  arrange(kreis)

df_ger_socdist
NA

Control for weekend effect


easter <- seq.Date(as.Date('2020-04-10'), as.Date('2020-04-13'), 1)

df_ger_loess <- df_ger_socdist %>% 
  mutate(weekday = format(date, '%u')) %>% 
  filter(!(weekday %in% c('6','7') | date %in% easter)) %>% 
  split(.$kreis) %>%
  map(~ loess(socdist_single_tile ~ time, data = .)) %>%
  map(predict, 1:max(df_ger_socdist$time)) %>% 
  bind_rows() %>% 
  gather(key = 'kreis', value = 'loess') %>% 
  group_by(kreis) %>% 
  mutate(time = row_number())

df_ger_loess_2 <- df_ger_socdist %>% 
  mutate(weekday = format(date, '%u')) %>% 
  filter(!(weekday %in% c('6','7') | date %in% easter)) %>% 
  split(.$kreis) %>%
  map(~ loess(socdist_tiles ~ time, data = .)) %>%
  map(predict, 1:max(df_ger_socdist$time)) %>% 
  bind_rows() %>% 
  gather(key = 'kreis', value = 'loess') %>% 
  rename(loess_2 = loess) %>%
  group_by(kreis) %>% 
  mutate(time = row_number())


df_ger_socdist <- df_ger_socdist %>% 
  merge(df_ger_loess, by=c('kreis', 'time')) %>% 
  merge(df_ger_loess_2, by=c('kreis', 'time')) %>% 
  mutate(weekday = format(date, '%u')) %>% 
  mutate(socdist_single_tile_clean = ifelse(weekday %in% c('6','7') | date %in% easter, 
                                            loess, socdist_single_tile),
         socdist_tiles_clean = ifelse(weekday %in% c('6','7') | date %in% easter, 
                                            loess_2, socdist_tiles)) %>%
  arrange(kreis, time) %>% 
  select(-weekday)

df_ger_socdist <- df_ger_socdist %>% drop_na() %>% mutate(time = time-1)

df_ger_socdist
NA

Explore data

Plot prevalence over time


df_ger_prev %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger_prev %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot social distancing (single tile) over time


df_ger_socdist %>% ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger_socdist %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}


df_ger_socdist %>% ggplot(aes(x=time, y=socdist_tiles_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger_socdist %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_tiles_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}


df_ger_socdist <- df_ger_socdist %>% 
  mutate(socdist_single_tile = socdist_single_tile_clean,
         socdist_tiles = socdist_tiles_clean) %>% 
  select(-loess, -loess_2, -socdist_single_tile_clean, -socdist_tiles_clean)

Correlations


df_ger_prev %>% group_by(kreis) %>% 
  summarize_if(is.numeric, mean) %>% 
  select(-kreis, -time) %>% 
  cor(use='pairwise.complete') %>% 
  round(3) %>% as.data.frame()

df_ger_socdist %>% group_by(kreis) %>% 
  summarize_if(is.numeric, mean) %>% 
  select(-kreis, -time) %>% 
  cor(use='pairwise.complete') %>% 
  round(3) %>% as.data.frame()
NA
NA

Rescale data


lvl2_scaled <- df_ger_prev %>% 
  dplyr::select(-time, -rate_day, -date) %>% 
  distinct() %>% 
  mutate_at(vars(-kreis), scale)
  
lvl1_scaled <- df_ger_prev %>% select(kreis, time, rate_day)

df_ger_prev_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'kreis')

df_ger_prev_scaled
NA

lvl2_scaled <- df_ger_socdist %>% 
  dplyr::select(-time, -socdist_single_tile, -socdist_tiles, -date) %>% 
  distinct() %>% 
  mutate_at(vars(-kreis), scale)
  
lvl1_scaled <- df_ger_socdist %>% select(kreis, time, socdist_single_tile, socdist_tiles)

df_ger_socdist_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'kreis')

df_ger_socdist_scaled
NA

Predict Prevalence

Extract first day of covid outbreak


# get onset day
df_ger_onset_prev <- df_ger_prev_scaled %>% 
  group_by(kreis) %>% 
  mutate(rate_cs = cumsum(rate_day)) %>% 
  filter(rate_cs > 0) %>%
  summarize(onset_prev = min(time))
  
# merge with county data
df_ger_onset_prev <- df_ger_prev_scaled %>% 
  select(-time, -rate_day) %>%
  distinct() %>% 
  left_join(df_ger_onset_prev, by = 'kreis')

# handle censored data
df_ger_onset_prev <- df_ger_onset_prev %>% 
  mutate(event = ifelse(is.na(onset_prev), 0, 1)) %>% 
  mutate(onset_prev = replace_na(onset_prev, as.numeric(diff(range(df_ger_prev$date)))+1))

df_ger_onset_prev
NA

Extract slopes


# cut time series before onset
df_ger_prev_scaled <- df_ger_prev_scaled %>% 
  group_by(kreis) %>% 
  mutate(rate_cs = cumsum(rate_day)) %>% 
  filter(rate_cs > 0) %>%
  mutate(time = time-min(time)+1) %>%
  ungroup() %>%
  filter(time <= 30) %>%
  select(-rate_cs)

# drop counties with little data
df_ger_prev_scaled <- df_ger_prev_scaled %>%
  group_by(kreis) %>%
  filter(n() == 30) %>%
  ungroup()

# extract slope prevalence
df_ger_slope_prev <- df_ger_prev_scaled %>% 
  split(.$kreis) %>% 
  map(~ lm(rate_day ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('kreis') %>% 
  rename(slope_prev = '.')

# merge with county data
df_ger_slope_prev <- df_ger_prev_scaled %>% 
  select(-time, -rate_day) %>%
  distinct() %>% 
  inner_join(df_ger_slope_prev, by = 'kreis') %>%
  drop_na()

# standardize slopes
df_ger_slope_prev <- df_ger_slope_prev %>% 
  mutate(slope_prev = scale(slope_prev))

Explore distributions


df_ger_onset_prev %>% ggplot(aes(onset_prev)) + geom_histogram()

df_ger_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram()

Predict COVID onset with time-to-event regression


# predict onset from personality
cox_onset_prev <- coxph(Surv(onset_prev, event) ~ 
                          pers_o + pers_c + pers_e + pers_a + pers_n, 
                        data = df_ger_onset_prev)
cox_onset_prev %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n, data = df_ger_onset_prev)

  n= 400, number of events= 400 

            coef exp(coef)  se(coef)      z Pr(>|z|)    
pers_o  0.131653  1.140712  0.051953  2.534   0.0113 *  
pers_c -0.104500  0.900775  0.053314 -1.960   0.0500 *  
pers_e  0.056186  1.057794  0.052903  1.062   0.2882    
pers_a -0.008624  0.991413  0.049615 -0.174   0.8620    
pers_n -0.276799  0.758207  0.057728 -4.795 1.63e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

       exp(coef) exp(-coef) lower .95 upper .95
pers_o    1.1407     0.8766    1.0303     1.263
pers_c    0.9008     1.1102    0.8114     1.000
pers_e    1.0578     0.9454    0.9536     1.173
pers_a    0.9914     1.0087    0.8995     1.093
pers_n    0.7582     1.3189    0.6771     0.849

Concordance= 0.592  (se = 0.018 )
Likelihood ratio test= 39.92  on 5 df,   p=2e-07
Wald test            = 37.99  on 5 df,   p=4e-07
Score (logrank) test = 37.99  on 5 df,   p=4e-07
# predict onset from personality with controls
cox_onset_prev_ctrl <- coxph(Surv(onset_prev, event) ~ 
                               pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens,
                             data = df_ger_onset_prev)
cox_onset_prev_ctrl %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n + women + academics + afd + hospital_beds + 
    tourism_beds + gdp + manufact + airport + age + popdens, 
    data = df_ger_onset_prev)

  n= 392, number of events= 392 
   (8 observations deleted due to missingness)

                   coef exp(coef)  se(coef)      z Pr(>|z|)    
pers_o         0.050510  1.051807  0.059853  0.844 0.398726    
pers_c        -0.087556  0.916168  0.061192 -1.431 0.152473    
pers_e         0.038883  1.039649  0.057895  0.672 0.501825    
pers_a         0.008022  1.008054  0.057017  0.141 0.888110    
pers_n        -0.222357  0.800630  0.063469 -3.503 0.000459 ***
women          0.066190  1.068429  0.067498  0.981 0.326785    
academics      0.267424  1.306595  0.094669  2.825 0.004730 ** 
afd           -0.072815  0.929773  0.075881 -0.960 0.337260    
hospital_beds -0.236175  0.789642  0.069836 -3.382 0.000720 ***
tourism_beds   0.076981  1.080022  0.054241  1.419 0.155829    
gdp           -0.175570  0.838979  0.115831 -1.516 0.129586    
manufact       0.147898  1.159395  0.094458  1.566 0.117404    
airport       -0.171432  0.842457  0.061687 -2.779 0.005451 ** 
age           -0.176055  0.838572  0.085439 -2.061 0.039343 *  
popdens        0.062986  1.065012  0.082801  0.761 0.446841    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

              exp(coef) exp(-coef) lower .95 upper .95
pers_o           1.0518     0.9507    0.9354    1.1827
pers_c           0.9162     1.0915    0.8126    1.0329
pers_e           1.0396     0.9619    0.9281    1.1646
pers_a           1.0081     0.9920    0.9015    1.1272
pers_n           0.8006     1.2490    0.7070    0.9067
women            1.0684     0.9360    0.9360    1.2196
academics        1.3066     0.7653    1.0853    1.5730
afd              0.9298     1.0755    0.8013    1.0789
hospital_beds    0.7896     1.2664    0.6886    0.9055
tourism_beds     1.0800     0.9259    0.9711    1.2012
gdp              0.8390     1.1919    0.6686    1.0528
manufact         1.1594     0.8625    0.9634    1.3952
airport          0.8425     1.1870    0.7465    0.9507
age              0.8386     1.1925    0.7093    0.9914
popdens          1.0650     0.9390    0.9055    1.2527

Concordance= 0.658  (se = 0.016 )
Likelihood ratio test= 101.3  on 15 df,   p=7e-15
Wald test            = 98.22  on 15 df,   p=3e-14
Score (logrank) test = 102.1  on 15 df,   p=5e-15

Predict prevalence slopes with linear models


# predict slopes from personality
lm_slope_prev <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n, 
                         data = df_ger_slope_prev)
lm_slope_prev %>% summary()

Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n, data = df_ger_slope_prev)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.1994 -0.5725 -0.1888  0.2940  8.6104 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.00174    0.05054   0.034    0.973
pers_o      -0.03181    0.05420  -0.587    0.558
pers_c      -0.05989    0.05799  -1.033    0.302
pers_e       0.07814    0.05745   1.360    0.175
pers_a       0.09131    0.05839   1.564    0.119
pers_n       0.06209    0.05971   1.040    0.299

Residual standard error: 1 on 386 degrees of freedom
Multiple R-squared:  0.01215,   Adjusted R-squared:  -0.0006472 
F-statistic: 0.9494 on 5 and 386 DF,  p-value: 0.4489
lm_slope_prev %>% confint(level=0.9)
                     5 %       95 %
(Intercept) -0.081594195 0.08507360
pers_o      -0.121173276 0.05756145
pers_c      -0.155494307 0.03572519
pers_e      -0.016586494 0.17286042
pers_a      -0.004968057 0.18758968
pers_n      -0.036363942 0.16053810
# predict slopes from personality with controls
lm_slope_prev_ctrl <- lm(slope_prev ~  
                               pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens,
                         data = df_ger_slope_prev)
lm_slope_prev_ctrl %>% summary()

Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n + women + academics + afd + hospital_beds + tourism_beds + 
    gdp + manufact + airport + age + popdens, data = df_ger_slope_prev)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.4465 -0.5788 -0.0848  0.3212  8.0256 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)   -0.0005982  0.0488695  -0.012   0.9902  
pers_o        -0.0160080  0.0603371  -0.265   0.7909  
pers_c         0.0018010  0.0584550   0.031   0.9754  
pers_e         0.0769996  0.0572311   1.345   0.1793  
pers_a         0.0832263  0.0586703   1.419   0.1569  
pers_n         0.0621839  0.0593346   1.048   0.2953  
women          0.1316729  0.0715869   1.839   0.0667 .
academics     -0.0618388  0.0955468  -0.647   0.5179  
afd           -0.0225847  0.0712477  -0.317   0.7514  
hospital_beds  0.0939475  0.0657371   1.429   0.1538  
tourism_beds  -0.0400654  0.0550991  -0.727   0.4676  
gdp           -0.0130746  0.1126142  -0.116   0.9076  
manufact       0.1729185  0.0894459   1.933   0.0540 .
airport        0.1503036  0.0612082   2.456   0.0145 *
age           -0.1912130  0.0908032  -2.106   0.0359 *
popdens       -0.1393613  0.0790525  -1.763   0.0787 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9665 on 376 degrees of freedom
Multiple R-squared:  0.1016,    Adjusted R-squared:  0.06581 
F-statistic: 2.836 on 15 and 376 DF,  p-value: 0.0003208
lm_slope_prev_ctrl %>% confint(level=0.9)
                      5 %         95 %
(Intercept)   -0.08118002  0.079983552
pers_o        -0.11549884  0.083482831
pers_c        -0.09458638  0.098188366
pers_e        -0.01736960  0.171368869
pers_a        -0.01351600  0.179968683
pers_n        -0.03565397  0.160021700
women          0.01363199  0.249713732
academics     -0.21938756  0.095709935
afd           -0.14006616  0.094896812
hospital_beds -0.01444736  0.202342442
tourism_beds  -0.13091924  0.050788398
gdp           -0.19876601  0.172616820
manufact       0.02542968  0.320407240
airport        0.04937648  0.251230766
age           -0.34093993 -0.041486083
popdens       -0.26971227 -0.009010392

CRF predicting slopes


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_slope_prev <- cforest(slope_prev ~  
                               pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens,
                           data = df_ger_slope_prev, 
                         controls = ctrls)

crf_slope_prev_varimp <- varimp(crf_slope_prev, nperm = 1)
crf_slope_prev_varimp_cond <- varimp(crf_slope_prev, conditional = T, nperm = 1)

crf_slope_prev_varimp
       pers_o        pers_c        pers_e        pers_a        pers_n         women 
 0.0051404436  0.0002964524  0.0008458686  0.0057439132  0.0033583582  0.0073071591 
    academics           afd hospital_beds  tourism_beds           gdp      manufact 
 0.0067329183  0.0153579773  0.0203683738 -0.0008152542  0.0229100482  0.0386981605 
      airport           age       popdens 
 0.0264143067  0.0168837599  0.0144487764 
crf_slope_prev_varimp %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_slope_prev_varimp_cond
       pers_o        pers_c        pers_e        pers_a        pers_n         women 
 0.0057961897  0.0016406381  0.0006215783  0.0061210301  0.0049832188  0.0146608870 
    academics           afd hospital_beds  tourism_beds           gdp      manufact 
 0.0056496432  0.0182956022  0.0217659545  0.0008632994  0.0275604756  0.0349663348 
      airport           age       popdens 
 0.0191283046  0.0256610220  0.0180434714 
crf_slope_prev_varimp_cond %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

Predict Social Distancing

Change point analysis


# keep only counties with full data
kreis_complete <- df_ger_socdist_scaled %>% 
  group_by(kreis) %>% 
  summarize(n = n()) %>% 
  filter(n==max(.$n)) %>% 
  .$kreis

# run changepoint analysis
df_ger_socdist_cpt_results <- df_ger_socdist_scaled %>% 
  select(kreis, socdist_single_tile) %>%
  filter(kreis %in% kreis_complete) %>% 
  split(.$kreis) %>%
  map(~ cpt.meanvar(as.vector(.$socdist_single_tile),
                    #penalty = 'Asymptotic',
                    class=TRUE,
                    param.estimates=TRUE,
                    Q=1,
                    test.stat = 'Normal'))

df_ger_socdist_cpt_results_2 <- df_ger_socdist_scaled %>% 
  select(kreis, socdist_tiles) %>%
  filter(kreis %in% kreis_complete) %>% 
  split(.$kreis) %>%
  map(~ cpt.meanvar(as.vector(.$socdist_tiles),
                    #penalty = 'Asymptotic',
                    class=TRUE,
                    param.estimates=TRUE,
                    Q=1,
                    test.stat = 'Normal'))

# calculate change point
df_ger_socdist_cpt_day <- df_ger_socdist_cpt_results %>% 
  map(cpts) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(cpt_day_socdist = '.') %>%
  rownames_to_column('kreis')

df_ger_socdist_cpt_day_2 <- df_ger_socdist_cpt_results_2 %>% 
  map(cpts) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(cpt_day_socdist_2 = '.') %>%
  rownames_to_column('kreis')

# calculate mean differences
df_ger_socdist_cpt_mean_diff <- df_ger_socdist_cpt_results %>% 
  map(param.est) %>% 
  map(~ .$mean) %>% 
  map(~ .[2]-.[1]) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(mean_diff_socdist = '.') %>%
  rownames_to_column('kreis')

df_ger_socdist_cpt_mean_diff_2 <- df_ger_socdist_cpt_results_2 %>% 
  map(param.est) %>% 
  map(~ .$mean) %>% 
  map(~ .[1]-.[2]) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(mean_diff_socdist_2 = '.') %>%
  rownames_to_column('kreis')

# merge with county data
df_ger_cpt_socdist <- df_ger_socdist_scaled %>% 
  select(-time, -socdist_single_tile, -socdist_tiles) %>%
  distinct() %>% 
  left_join(df_ger_socdist_cpt_day, by='kreis') %>%
  left_join(df_ger_socdist_cpt_day_2, by='kreis') %>%
  left_join(df_ger_socdist_cpt_mean_diff, by='kreis') %>%
  left_join(df_ger_socdist_cpt_mean_diff_2, by='kreis') %>%
  left_join(select(df_ger_onset_prev, kreis, onset_prev), by='kreis') %>%
  left_join(select(df_ger_slope_prev, kreis, slope_prev), by='kreis') 

# standardize mean/var differences
df_ger_cpt_socdist <- df_ger_cpt_socdist %>% 
  mutate(mean_diff_socdist = scale(mean_diff_socdist),
         mean_diff_socdist_2 = scale(mean_diff_socdist_2))

# handle censored data
df_ger_cpt_socdist <- df_ger_cpt_socdist %>% 
  mutate(cpt_day_socdist = ifelse(is.na(cpt_day_socdist), 
                                  as.numeric(diff(range(df_ger_socdist$date))), 
                                  cpt_day_socdist)) %>% 
  mutate(event = ifelse(cpt_day_socdist >= 
                          as.numeric(diff(range(df_ger_socdist$date))), 0, 1))
df_ger_cpt_socdist$cpt_day_socdist %>% hist()

df_ger_cpt_socdist$mean_diff_socdist %>% hist()

df_ger_cpt_socdist$cpt_day_socdist_2 %>% hist()

df_ger_cpt_socdist$mean_diff_socdist_2 %>% hist()


for(i in head(df_ger_socdist_cpt_results, 5)){
  plot(i)
}

NA


for(i in head(df_ger_socdist_cpt_results_2, 5)){
  plot(i)
}

NA


# predict hazard from personality
cox_cpt_socdist <- coxph(Surv(cpt_day_socdist, event) ~ 
                           pers_o + pers_c + pers_e + pers_a + pers_n, 
                  data = df_ger_cpt_socdist)
cox_cpt_socdist %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n, data = df_ger_cpt_socdist)

  n= 388, number of events= 388 

           coef exp(coef) se(coef)      z Pr(>|z|)
pers_o  0.05673   1.05837  0.05265  1.077    0.281
pers_c -0.07378   0.92887  0.05676 -1.300    0.194
pers_e -0.01139   0.98868  0.05348 -0.213    0.831
pers_a  0.01996   1.02016  0.05675  0.352    0.725
pers_n -0.08220   0.92109  0.05796 -1.418    0.156

       exp(coef) exp(-coef) lower .95 upper .95
pers_o    1.0584     0.9448    0.9546     1.173
pers_c    0.9289     1.0766    0.8311     1.038
pers_e    0.9887     1.0115    0.8903     1.098
pers_a    1.0202     0.9802    0.9128     1.140
pers_n    0.9211     1.0857    0.8222     1.032

Concordance= 0.577  (se = 0.032 )
Likelihood ratio test= 5.15  on 5 df,   p=0.4
Wald test            = 5.09  on 5 df,   p=0.4
Score (logrank) test = 5.07  on 5 df,   p=0.4
# predict hazard from personality with controls
cox_cpt_socdist_ctrl <- coxph(Surv(cpt_day_socdist, event) ~ 
                                 pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens + onset_prev + slope_prev,
                  data = df_ger_cpt_socdist)
cox_cpt_socdist_ctrl %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n + women + academics + afd + hospital_beds + 
    tourism_beds + gdp + manufact + airport + age + popdens + 
    onset_prev + slope_prev, data = df_ger_cpt_socdist)

  n= 388, number of events= 388 

                   coef exp(coef)  se(coef)      z Pr(>|z|)  
pers_o        -0.014023  0.986074  0.060352 -0.232   0.8163  
pers_c        -0.047850  0.953276  0.063658 -0.752   0.4522  
pers_e        -0.076772  0.926101  0.060192 -1.275   0.2021  
pers_a         0.031209  1.031702  0.062329  0.501   0.6166  
pers_n        -0.051163  0.950124  0.064146 -0.798   0.4251  
women          0.054863  1.056396  0.078455  0.699   0.4844  
academics      0.042787  1.043716  0.100044  0.428   0.6689  
afd           -0.102751  0.902352  0.079393 -1.294   0.1956  
hospital_beds -0.122714  0.884517  0.064029 -1.917   0.0553 .
tourism_beds  -0.072532  0.930036  0.063312 -1.146   0.2519  
gdp           -0.023656  0.976622  0.112906 -0.210   0.8340  
manufact      -0.069439  0.932917  0.097472 -0.712   0.4762  
airport       -0.053081  0.948303  0.069661 -0.762   0.4461  
age           -0.072439  0.930123  0.101574 -0.713   0.4757  
popdens        0.102682  1.108138  0.083326  1.232   0.2178  
onset_prev    -0.003794  0.996213  0.005078 -0.747   0.4550  
slope_prev     0.025648  1.025980  0.069072  0.371   0.7104  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

              exp(coef) exp(-coef) lower .95 upper .95
pers_o           0.9861     1.0141    0.8761     1.110
pers_c           0.9533     1.0490    0.8415     1.080
pers_e           0.9261     1.0798    0.8230     1.042
pers_a           1.0317     0.9693    0.9131     1.166
pers_n           0.9501     1.0525    0.8379     1.077
women            1.0564     0.9466    0.9058     1.232
academics        1.0437     0.9581    0.8579     1.270
afd              0.9024     1.1082    0.7723     1.054
hospital_beds    0.8845     1.1306    0.7802     1.003
tourism_beds     0.9300     1.0752    0.8215     1.053
gdp              0.9766     1.0239    0.7827     1.219
manufact         0.9329     1.0719    0.7707     1.129
airport          0.9483     1.0545    0.8273     1.087
age              0.9301     1.0751    0.7622     1.135
popdens          1.1081     0.9024    0.9412     1.305
onset_prev       0.9962     1.0038    0.9863     1.006
slope_prev       1.0260     0.9747    0.8961     1.175

Concordance= 0.721  (se = 0.028 )
Likelihood ratio test= 40.73  on 17 df,   p=0.001
Wald test            = 40.93  on 17 df,   p=0.001
Score (logrank) test = 41.74  on 17 df,   p=7e-04

Predicting change points with time-to-event regression


lm_meandiff_socdist <- lm(mean_diff_socdist ~ 
                            pers_o + pers_c + pers_e + pers_a + pers_n, 
                         data = df_ger_cpt_socdist)
lm_meandiff_socdist %>% summary()

Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n, data = df_ger_cpt_socdist)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.9088 -0.5744 -0.0379  0.5828  3.9301 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.159e-16  4.626e-02   0.000   1.0000    
pers_o       3.738e-01  4.945e-02   7.559 3.04e-13 ***
pers_c      -8.195e-02  5.263e-02  -1.557   0.1203    
pers_e       7.612e-02  5.251e-02   1.450   0.1480    
pers_a      -2.138e-03  5.355e-02  -0.040   0.9682    
pers_n      -9.522e-02  5.456e-02  -1.745   0.0817 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9112 on 382 degrees of freedom
Multiple R-squared:  0.1804,    Adjusted R-squared:  0.1697 
F-statistic: 16.81 on 5 and 382 DF,  p-value: 5.023e-15
lm_meandiff_socdist %>% confint(level=0.9)
                    5 %         95 %
(Intercept) -0.07627701  0.076277015
pers_o       0.29225959  0.455325715
pers_c      -0.16872746  0.004834687
pers_e      -0.01046647  0.162698671
pers_a      -0.09042850  0.086151871
pers_n      -0.18518596 -0.005261399
lm_meandiff_socdist_ctrl <- lm(mean_diff_socdist ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens + onset_prev + slope_prev,
                  data = df_ger_cpt_socdist)
lm_meandiff_socdist_ctrl %>% summary()

Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n + women + academics + afd + hospital_beds + tourism_beds + 
    gdp + manufact + airport + age + popdens + onset_prev + slope_prev, 
    data = df_ger_cpt_socdist)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.87447 -0.43609 -0.04652  0.40255  1.91077 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.272459   0.192825   1.413   0.1585    
pers_o         0.091983   0.041734   2.204   0.0281 *  
pers_c         0.022486   0.040543   0.555   0.5795    
pers_e        -0.022524   0.040138  -0.561   0.5750    
pers_a        -0.007898   0.041152  -0.192   0.8479    
pers_n         0.018154   0.041694   0.435   0.6635    
women          0.108055   0.049875   2.167   0.0309 *  
academics      0.108896   0.063995   1.702   0.0897 .  
afd           -0.094799   0.050150  -1.890   0.0595 .  
hospital_beds -0.106259   0.044865  -2.368   0.0184 *  
tourism_beds   0.024920   0.038925   0.640   0.5224    
gdp            0.310743   0.076923   4.040 6.51e-05 ***
manufact      -0.037805   0.063291  -0.597   0.5507    
airport       -0.032251   0.043407  -0.743   0.4580    
age           -0.272654   0.063959  -4.263 2.56e-05 ***
popdens        0.103290   0.054637   1.890   0.0595 .  
onset_prev    -0.004866   0.003387  -1.436   0.1517    
slope_prev     0.211525   0.040301   5.249 2.59e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6717 on 370 degrees of freedom
Multiple R-squared:  0.5686,    Adjusted R-squared:  0.5488 
F-statistic: 28.68 on 17 and 370 DF,  p-value: < 2.2e-16
lm_meandiff_socdist_ctrl %>% confint(level=0.9)
                      5 %         95 %
(Intercept)   -0.04550617  0.590424375
pers_o         0.02316347  0.160801944
pers_c        -0.04436977  0.089341100
pers_e        -0.08870971  0.043662416
pers_a        -0.07575735  0.059960924
pers_n        -0.05059917  0.086906294
women          0.02581175  0.190297877
academics      0.00336963  0.214422260
afd           -0.17749642 -0.012102299
hospital_beds -0.18023974 -0.032277423
tourism_beds  -0.03926581  0.089105948
gdp            0.18389830  0.437587645
manufact      -0.14217100  0.066561843
airport       -0.10382845  0.039327244
age           -0.37812107 -0.167186538
popdens        0.01319502  0.193384651
onset_prev    -0.01045107  0.000720025
slope_prev     0.14506839  0.277981025

Linear models predicting mean differences


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_meandiff_socdist <- cforest(mean_diff_socdist ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens + onset_prev + slope_prev,
                              data = df_ger_cpt_socdist %>% drop_na(),
                         controls = ctrls)

crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist, conditional = T, nperm = 1)

crf_meandiff_socdist_varimp
       pers_o        pers_c        pers_e        pers_a        pers_n         women 
 1.759975e-02  6.337446e-05  2.610670e-03  1.835394e-04  9.390769e-04  7.905424e-03 
    academics           afd hospital_beds  tourism_beds           gdp      manufact 
 1.577308e-01  1.241787e-01  7.915686e-03  1.073799e-03  1.369025e-01  8.551752e-03 
      airport           age       popdens    onset_prev    slope_prev 
 8.763834e-03  2.131369e-01  7.312826e-02  9.758102e-04  1.419053e-02 
crf_meandiff_socdist_varimp %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))


crf_meandiff_socdist_varimp_cond
       pers_o        pers_c        pers_e        pers_a        pers_n         women 
 0.0180832096 -0.0014234895  0.0014359473 -0.0005199509  0.0002390713  0.0070661971 
    academics           afd hospital_beds  tourism_beds           gdp      manufact 
 0.1595062896  0.1220725600  0.0058460091  0.0030843814  0.1339119408  0.0115030151 
      airport           age       popdens    onset_prev    slope_prev 
 0.0095423799  0.2094029437  0.0710187422  0.0013900179  0.0152997826 
crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

CRF predicting mean difference


# predict hazard from personality
cox_cpt_socdist_2 <- coxph(Surv(cpt_day_socdist_2, event) ~ 
                           pers_o + pers_c + pers_e + pers_a + pers_n, 
                  data = df_ger_cpt_socdist)
cox_cpt_socdist_2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist_2, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n, data = df_ger_cpt_socdist)

  n= 388, number of events= 388 

           coef exp(coef) se(coef)      z Pr(>|z|)
pers_o -0.03062   0.96985  0.05543 -0.552    0.581
pers_c -0.08996   0.91397  0.05478 -1.642    0.101
pers_e -0.01517   0.98495  0.05758 -0.263    0.792
pers_a -0.04174   0.95912  0.05991 -0.697    0.486
pers_n -0.06473   0.93732  0.05898 -1.098    0.272

       exp(coef) exp(-coef) lower .95 upper .95
pers_o    0.9698      1.031    0.8700     1.081
pers_c    0.9140      1.094    0.8209     1.018
pers_e    0.9849      1.015    0.8798     1.103
pers_a    0.9591      1.043    0.8529     1.079
pers_n    0.9373      1.067    0.8350     1.052

Concordance= 0.542  (se = 0.026 )
Likelihood ratio test= 5.04  on 5 df,   p=0.4
Wald test            = 5.17  on 5 df,   p=0.4
Score (logrank) test = 5.15  on 5 df,   p=0.4
# predict hazard from personality with controls
cox_cpt_socdist_ctrl_2 <- coxph(Surv(cpt_day_socdist_2, event) ~ 
                                 pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens + onset_prev + slope_prev,
                  data = df_ger_cpt_socdist)
cox_cpt_socdist_ctrl_2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist_2, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n + women + academics + afd + hospital_beds + 
    tourism_beds + gdp + manufact + airport + age + popdens + 
    onset_prev + slope_prev, data = df_ger_cpt_socdist)

  n= 388, number of events= 388 

                   coef exp(coef)  se(coef)      z Pr(>|z|)   
pers_o        -0.076112  0.926712  0.065660 -1.159  0.24638   
pers_c        -0.020391  0.979816  0.059956 -0.340  0.73378   
pers_e        -0.065070  0.937002  0.063923 -1.018  0.30870   
pers_a        -0.018041  0.982121  0.063163 -0.286  0.77517   
pers_n        -0.010432  0.989622  0.066307 -0.157  0.87499   
women          0.124722  1.132833  0.080148  1.556  0.11967   
academics     -0.020774  0.979441  0.102622 -0.202  0.83958   
afd           -0.245341  0.782438  0.078871 -3.111  0.00187 **
hospital_beds -0.121340  0.885733  0.066852 -1.815  0.06952 . 
tourism_beds   0.042779  1.043707  0.058321  0.734  0.46325   
gdp           -0.102634  0.902457  0.122794 -0.836  0.40326   
manufact      -0.044267  0.956699  0.100845 -0.439  0.66069   
airport        0.058871  1.060638  0.068799  0.856  0.39217   
age           -0.068118  0.934150  0.099304 -0.686  0.49274   
popdens        0.181209  1.198666  0.085109  2.129  0.03324 * 
onset_prev    -0.013244  0.986844  0.005022 -2.637  0.00836 **
slope_prev     0.139626  1.149843  0.063239  2.208  0.02725 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

              exp(coef) exp(-coef) lower .95 upper .95
pers_o           0.9267     1.0791    0.8148    1.0540
pers_c           0.9798     1.0206    0.8712    1.1020
pers_e           0.9370     1.0672    0.8267    1.0621
pers_a           0.9821     1.0182    0.8678    1.1116
pers_n           0.9896     1.0105    0.8690    1.1270
women            1.1328     0.8827    0.9682    1.3255
academics        0.9794     1.0210    0.8010    1.1977
afd              0.7824     1.2781    0.6704    0.9132
hospital_beds    0.8857     1.1290    0.7770    1.0097
tourism_beds     1.0437     0.9581    0.9310    1.1701
gdp              0.9025     1.1081    0.7094    1.1480
manufact         0.9567     1.0453    0.7851    1.1658
airport          1.0606     0.9428    0.9268    1.2138
age              0.9342     1.0705    0.7689    1.1349
popdens          1.1987     0.8343    1.0145    1.4163
onset_prev       0.9868     1.0133    0.9772    0.9966
slope_prev       1.1498     0.8697    1.0158    1.3016

Concordance= 0.659  (se = 0.029 )
Likelihood ratio test= 64.35  on 17 df,   p=2e-07
Wald test            = 60.37  on 17 df,   p=9e-07
Score (logrank) test = 61.6  on 17 df,   p=6e-07

Predicting change points with time-to-event regression


lm_meandiff_socdist_2 <- lm(mean_diff_socdist_2 ~ 
                            pers_o + pers_c + pers_e + pers_a + pers_n, 
                         data = df_ger_cpt_socdist)
lm_meandiff_socdist_2 %>% summary()

Call:
lm(formula = mean_diff_socdist_2 ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n, data = df_ger_cpt_socdist)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.4864 -0.6476  0.0330  0.6232  3.9993 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.163e-17  4.899e-02   0.000    1.000    
pers_o       2.149e-01  5.236e-02   4.103 4.98e-05 ***
pers_c      -2.038e-02  5.573e-02  -0.366    0.715    
pers_e       5.729e-02  5.560e-02   1.030    0.303    
pers_a       8.964e-02  5.670e-02   1.581    0.115    
pers_n      -5.135e-02  5.777e-02  -0.889    0.375    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9649 on 382 degrees of freedom
Multiple R-squared:  0.08099,   Adjusted R-squared:  0.06896 
F-statistic: 6.733 on 5 and 382 DF,  p-value: 4.976e-06
lm_meandiff_socdist_2 %>% confint(level=0.9)
                     5 %       95 %
(Intercept) -0.080769970 0.08076997
pers_o       0.128518892 0.30119012
pers_c      -0.112269977 0.07151552
pers_e      -0.034389315 0.14897579
pers_a      -0.003848162 0.18313334
pers_n      -0.146606823 0.04391585
lm_meandiff_socdist_ctrl_2 <- lm(mean_diff_socdist_2 ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens + onset_prev + slope_prev,
                  data = df_ger_cpt_socdist)
lm_meandiff_socdist_ctrl_2 %>% summary()

Call:
lm(formula = mean_diff_socdist_2 ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n + women + academics + afd + hospital_beds + 
    tourism_beds + gdp + manufact + airport + age + popdens + 
    onset_prev + slope_prev, data = df_ger_cpt_socdist)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3284 -0.5947 -0.0486  0.4943  2.6870 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.1053843  0.2498635   0.422  0.67344    
pers_o         0.0505085  0.0540795   0.934  0.35093    
pers_c         0.0006957  0.0525363   0.013  0.98944    
pers_e        -0.0061037  0.0520103  -0.117  0.90664    
pers_a         0.0468739  0.0533251   0.879  0.37996    
pers_n         0.0156088  0.0540273   0.289  0.77281    
women          0.1236199  0.0646283   1.913  0.05655 .  
academics      0.1883589  0.0829247   2.271  0.02369 *  
afd            0.0381998  0.0649850   0.588  0.55701    
hospital_beds -0.2356647  0.0581359  -4.054 6.15e-05 ***
tourism_beds  -0.0174050  0.0504386  -0.345  0.73024    
gdp            0.2701306  0.0996771   2.710  0.00704 ** 
manufact      -0.1433300  0.0820132  -1.748  0.08136 .  
airport       -0.0448547  0.0562473  -0.797  0.42570    
age           -0.1268930  0.0828783  -1.531  0.12660    
popdens       -0.0209434  0.0707983  -0.296  0.76753    
onset_prev    -0.0018842  0.0043892  -0.429  0.66797    
slope_prev     0.2389105  0.0522227   4.575 6.51e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8704 on 370 degrees of freedom
Multiple R-squared:  0.2756,    Adjusted R-squared:  0.2423 
F-statistic: 8.281 on 17 and 370 DF,  p-value: < 2.2e-16
lm_meandiff_socdist_ctrl_2 %>% confint(level=0.9)
                       5 %         95 %
(Intercept)   -0.306636205  0.517404846
pers_o        -0.038667716  0.139684709
pers_c        -0.085935802  0.087327214
pers_e        -0.091867797  0.079660466
pers_a        -0.041058174  0.134806050
pers_n        -0.073481190  0.104698880
women          0.017049040  0.230190746
academics      0.051617574  0.325100319
afd           -0.068959305  0.145358984
hospital_beds -0.331529771 -0.139799674
tourism_beds  -0.100577292  0.065767285
gdp            0.105764825  0.434496381
manufact      -0.278568362 -0.008091609
airport       -0.137605486  0.047896166
age           -0.263557896  0.009771815
popdens       -0.137688624  0.095801741
onset_prev    -0.009121997  0.005353544
slope_prev     0.152796191  0.325024849

Linear models predicting mean differences


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_meandiff_socdist_2 <- cforest(mean_diff_socdist_2 ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n +
                               women + academics + afd + hospital_beds +
                               tourism_beds + gdp + manufact + airport + age +
                               popdens + onset_prev + slope_prev,
                              data = df_ger_cpt_socdist %>% drop_na(),
                         controls = ctrls)

crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist_2, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist_2, conditional = T, nperm = 1)

crf_meandiff_socdist_varimp
       pers_o        pers_c        pers_e        pers_a        pers_n         women 
 0.0061045393 -0.0024349997  0.0069040770  0.0083183883  0.0009496786  0.0045345045 
    academics           afd hospital_beds  tourism_beds           gdp      manufact 
 0.1876559130  0.0277172348  0.0269946837  0.0018742661  0.0361798105  0.0179608113 
      airport           age       popdens    onset_prev    slope_prev 
 0.0059095875  0.0536333125  0.0187286793 -0.0006441898  0.0477348349 
crf_meandiff_socdist_varimp %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))


crf_meandiff_socdist_varimp_cond
       pers_o        pers_c        pers_e        pers_a        pers_n         women 
 0.0055679584 -0.0021325301  0.0026940890  0.0076168975 -0.0004095212  0.0059936567 
    academics           afd hospital_beds  tourism_beds           gdp      manufact 
 0.1855315339  0.0303020488  0.0293348797  0.0041487670  0.0301259137  0.0205806193 
      airport           age       popdens    onset_prev    slope_prev 
 0.0045007395  0.0512203214  0.0193736309  0.0011647302  0.0418606350 
crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

CRF predicting mean difference


ger_list_results <- list(cox_onset_prev, cox_onset_prev_ctrl, 
     lm_slope_prev, lm_slope_prev_ctrl, 
     cox_cpt_socdist, cox_cpt_socdist_ctrl,
     lm_meandiff_socdist, lm_meandiff_socdist_ctrl,
     cox_cpt_socdist_2, cox_cpt_socdist_ctrl_2,
     lm_meandiff_socdist_2, lm_meandiff_socdist_ctrl_2)

results_names <- list('cox_onset_prev', 'cox_onset_prev_ctrl', 
     'lm_slope_prev', 'lm_slope_prev_ctrl', 
     'cox_cpt_socdist', 'cox_cpt_socdist_ctrl', 
     'lm_meandiff_socdist', 'lm_meandiff_socdist_ctrl',
     'cox_cpt_socdist_2', 'cox_cpt_socdist_ctrl_2',
     'lm_meandiff_socdist_2', 'lm_meandiff_socdist_ctrl_2')

names(ger_list_results) <- results_names

save(ger_list_results, file="ger_list_results.RData")

Export data


write_csv(df_ger_slope_prev, '/Users/hp2500/Google Drive/STUDY/Columbia/Research/Corona/Delivery/df_ger_slope_prev.csv')
write_csv(df_ger_cpt_socdist, '/Users/hp2500/Google Drive/STUDY/Columbia/Research/Corona/Delivery/df_ger_cpt_socdist.csv')

write_csv(df_ger_slope_prev, '/Users/hp2500/Google Drive/STUDY/Columbia/Research/Corona/Delivery/df_ger_slope_prev.csv')
write_csv(df_ger_cpt_socdist, '/Users/hp2500/Google Drive/STUDY/Columbia/Research/Corona/Delivery/df_ger_cpt_socdist.csv')
LS0tCnRpdGxlOiAiQ09WSUQxOSBHRVIiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMjMvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCgojIE1BQwoga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1VzZXJzL2hwMjUwMC9Hb29nbGUgRHJpdmUvU1RVRFkvQ29sdW1iaWEvUmVzZWFyY2gvQ29yb25hL0RhdGEvR0VSJykKIApsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCgpgYGAKCiMgUHJlcGFyZSBkYXRhCgojIyMgUHJldmFsZW5jZQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKZGZfZ2VyX3ByZXYgPC0gcmVhZF9jc3YoJ0dlcm1hbnlfdGltZXNlcmllc19wcmVwLmNzdicpCgpkZl9nZXJfcHJldiA8LSBkZl9nZXJfcHJldiAlPiUgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlZCViJVkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSkgJT4lIAogIGRwbHlyOjpzZWxlY3Qoa3JlaXMsIGRhdGUsIHJhdGVfZGF5KQoKZGZfZ2VyX3ByZXYKYGBgCgojIyMgU2NvaWFsIGRpc3RhbmNpbmcKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmZiX2ZpbGVzIDwtIGxpc3QuZmlsZXMoJy4uL0ZCIERhdGEvR0VSIGluZGl2aWR1YWwgZmlsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICcqLmNzdicsIGZ1bGwubmFtZXMgPSBUKQoKZGZfZ2VyX3NvY2Rpc3QgPC0gZmJfZmlsZXMgJT4lIAogIG1hcChyZWFkLmNzdikgJT4lIGJpbmRfcm93cygpCgprcmVpc19tYXRjaCA8LSByZWFkX2Nzdigna3JlaXNtYXRjaC5jc3YnKQoKZGZfZ2VyX3NvY2Rpc3QgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIHNlbGVjdCgtcG9seWdvbl9uYW1lKSAlPiUgCiAgcGx5cjo6am9pbihrcmVpc19tYXRjaCwgYnkgPSAncG9seWdvbl9pZCcpICU+JQogIHNlbGVjdChrcmVpcywgZHMsIGFsbF9kYXlfYmluZ190aWxlc192aXNpdGVkX3JlbGF0aXZlX2NoYW5nZSwKICAgICAgICAgYWxsX2RheV9yYXRpb19zaW5nbGVfdGlsZV91c2VycykgJT4lCiAgcmVuYW1lKGRhdGUgPSBkcywKICAgICAgICAgc29jZGlzdF90aWxlcyA9IGFsbF9kYXlfYmluZ190aWxlc192aXNpdGVkX3JlbGF0aXZlX2NoYW5nZSwKICAgICAgICAgc29jZGlzdF9zaW5nbGVfdGlsZSA9IGFsbF9kYXlfcmF0aW9fc2luZ2xlX3RpbGVfdXNlcnMpICU+JQogIG11dGF0ZShrcmVpcyA9IGFzLmNoYXJhY3RlcihrcmVpcyksCiAgICAgICAgIGRhdGUgPSBhcy5EYXRlKGRhdGUpKSAlPiUKICBhcnJhbmdlKGtyZWlzLCBkYXRlKQoKZGZfZ2VyX3NvY2Rpc3QKYGBgCgojIyMgUGVyc29uYWxpdHkgCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpkZl9nZXJfcGVycyA8LSByZWFkX2NzdignR2VybWFueV90aW1lc2VyaWVzX3ByZXAuY3N2JykKCmRmX2dlcl9wZXJzIDwtIGRmX2dlcl9wZXJzICU+JSAKICBzZWxlY3Qoa3JlaXMsIG9wZW4sIHNjaSwgZXh0cmEsIGFncmVlLCBuZXVybykgJT4lCiAgZHBseXI6OnJlbmFtZShwZXJzX28gPSBvcGVuLCAKICAgICAgICAgcGVyc19jID0gc2NpLAogICAgICAgICBwZXJzX2UgPSBleHRyYSwKICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgIHBlcnNfbiA9IG5ldXJvKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShrcmVpcyA9IGFzLmNoYXJhY3RlcihrcmVpcykpCgpkZl9nZXJfcGVycwoKYGBgCgoKIyMjIENvbnRyb2xzIApgYGB7cn0KCmRmX2dlcl9jdHJsIDwtIHJlYWQuY3N2MignR2VybWFueV9jb250cm9scy5jc3YnLCBzZXAgPSAnOycsIGRlYz0nLCcpCgpkZl9nZXJfY3RybCA8LSBkZl9nZXJfY3RybCAlPiUgc2VsZWN0KC1rcmVpc19ubWUpICU+JQogICAgbXV0YXRlKGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSwKICAgICAgICAgICBwb3BkZW5zID0gcG9wZGVucyAlPiUgCiAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoKSAlPiUKICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXC4nLCAnJyklPiUKICAgICAgICAgICAgIGFzLm51bWVyaWMoKSkKCmRmX2dlcl9jdHJsCgpkZl9nZXJfcGVycyAlPiUgbWVyZ2UoZGZfZ2VyX2N0cmwsIGJ5PSdrcmVpcycpICU+JSB3cml0ZV9jc3YoJ2RmX2dlcl9wZXJzX2tyZWlzLmNzdicpCmBgYAoKIyMjIE1lcmdlIHByZXZhbGVuY2UgZGF0YSAKYGBge3J9CiMgY3JlYXRlIHNlcXVlbmNlIG9mIGRhdGVzCmRhdGVfc2VxdWVuY2UgPC0gc2VxLkRhdGUobWluKGRmX2dlcl9wcmV2JGRhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkZl9nZXJfcHJldiRkYXRlKSwgMSkKICAgICAgICAgICAgICAgICAgICAgCiMgY3JlYXRlIGRhdGEgZnJhbWUgd2l0aCB0aW1lIHNlcXVlbmNlCmRmX2RhdGVzID0gdGliYmxlKGRhdGVfc2VxdWVuY2UsIDE6bGVuZ3RoKGRhdGVfc2VxdWVuY2UpKSAKbmFtZXMoZGZfZGF0ZXMpIDwtIGMoJ2RhdGUnLCAndGltZScpCgoKIyBtZXJnZSBwcmV2YWxlbmNlIGRhdGEKZGZfZ2VyX3ByZXYgPC0gZGZfZ2VyX3ByZXYgJT4lIAogIGlubmVyX2pvaW4oZGZfZ2VyX3BlcnMsIGJ5ID0gJ2tyZWlzJykgJT4lCiAgaW5uZXJfam9pbihkZl9nZXJfY3RybCwgYnkgPSAna3JlaXMnKSAlPiUKICBtZXJnZShkZl9kYXRlcywgYnk9J2RhdGUnKSAlPiUgCiAgYXJyYW5nZShrcmVpcykKCmRmX2dlcl9wcmV2CmBgYAoKIyMjIE1lcmdlIHNvY2Rpc3QgZGF0YQpgYGB7cn0KCiMgY3JlYXRlIHNlcXVlbmNlIG9mIGRhdGVzCmRhdGVfc2VxdWVuY2UgPC0gc2VxLkRhdGUobWluKGRmX2dlcl9zb2NkaXN0JGRhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkZl9nZXJfc29jZGlzdCRkYXRlKSwgMSkKICAgICAgICAgICAgICAgICAgICAgCiMgY3JlYXRlIGRhdGEgZnJhbWUgd2l0aCB0aW1lIHNlcXVlbmNlCmRmX2RhdGVzID0gdGliYmxlKGRhdGVfc2VxdWVuY2UsIDE6bGVuZ3RoKGRhdGVfc2VxdWVuY2UpKSAKbmFtZXMoZGZfZGF0ZXMpIDwtIGMoJ2RhdGUnLCAndGltZScpCgojIG1lcmdlIHNvY2Rpc3QgZGF0YQpkZl9nZXJfc29jZGlzdCA8LSBkZl9nZXJfc29jZGlzdCAlPiUgCiAgaW5uZXJfam9pbihkZl9nZXJfcGVycywgYnkgPSAna3JlaXMnKSAlPiUKICBpbm5lcl9qb2luKGRmX2dlcl9jdHJsLCBieSA9ICdrcmVpcycpICU+JSAKICBtZXJnZShkZl9kYXRlcywgYnk9J2RhdGUnKSAlPiUgCiAgYXJyYW5nZShrcmVpcykKCmRmX2dlcl9zb2NkaXN0CgpgYGAKCiMjIyBDb250cm9sIGZvciB3ZWVrZW5kIGVmZmVjdCAKYGBge3J9CgplYXN0ZXIgPC0gc2VxLkRhdGUoYXMuRGF0ZSgnMjAyMC0wNC0xMCcpLCBhcy5EYXRlKCcyMDIwLTA0LTEzJyksIDEpCgpkZl9nZXJfbG9lc3MgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIG11dGF0ZSh3ZWVrZGF5ID0gZm9ybWF0KGRhdGUsICcldScpKSAlPiUgCiAgZmlsdGVyKCEod2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyKSkgJT4lIAogIHNwbGl0KC4ka3JlaXMpICU+JQogIG1hcCh+IGxvZXNzKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChwcmVkaWN0LCAxOm1heChkZl9nZXJfc29jZGlzdCR0aW1lKSkgJT4lIAogIGJpbmRfcm93cygpICU+JSAKICBnYXRoZXIoa2V5ID0gJ2tyZWlzJywgdmFsdWUgPSAnbG9lc3MnKSAlPiUgCiAgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBtdXRhdGUodGltZSA9IHJvd19udW1iZXIoKSkKCmRmX2dlcl9sb2Vzc18yIDwtIGRmX2dlcl9zb2NkaXN0ICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIGZpbHRlcighKHdlZWtkYXkgJWluJSBjKCc2JywnNycpIHwgZGF0ZSAlaW4lIGVhc3RlcikpICU+JSAKICBzcGxpdCguJGtyZWlzKSAlPiUKICBtYXAofiBsb2Vzcyhzb2NkaXN0X3RpbGVzIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAocHJlZGljdCwgMTptYXgoZGZfZ2VyX3NvY2Rpc3QkdGltZSkpICU+JSAKICBiaW5kX3Jvd3MoKSAlPiUgCiAgZ2F0aGVyKGtleSA9ICdrcmVpcycsIHZhbHVlID0gJ2xvZXNzJykgJT4lIAogIHJlbmFtZShsb2Vzc18yID0gbG9lc3MpICU+JQogIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpCgoKZGZfZ2VyX3NvY2Rpc3QgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIG1lcmdlKGRmX2dlcl9sb2VzcywgYnk9Yygna3JlaXMnLCAndGltZScpKSAlPiUgCiAgbWVyZ2UoZGZfZ2VyX2xvZXNzXzIsIGJ5PWMoJ2tyZWlzJywgJ3RpbWUnKSkgJT4lIAogIG11dGF0ZSh3ZWVrZGF5ID0gZm9ybWF0KGRhdGUsICcldScpKSAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4gPSBpZmVsc2Uod2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2Vzcywgc29jZGlzdF9zaW5nbGVfdGlsZSksCiAgICAgICAgIHNvY2Rpc3RfdGlsZXNfY2xlYW4gPSBpZmVsc2Uod2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2Vzc18yLCBzb2NkaXN0X3RpbGVzKSkgJT4lCiAgYXJyYW5nZShrcmVpcywgdGltZSkgJT4lIAogIHNlbGVjdCgtd2Vla2RheSkKCmRmX2dlcl9zb2NkaXN0IDwtIGRmX2dlcl9zb2NkaXN0ICU+JSBkcm9wX25hKCkgJT4lIG11dGF0ZSh0aW1lID0gdGltZS0xKQoKZGZfZ2VyX3NvY2Rpc3QKYGBgCgoKIyBFeHBsb3JlIGRhdGEKCiMjIyBQbG90IHByZXZhbGVuY2Ugb3ZlciB0aW1lCmBgYHtyfQoKZGZfZ2VyX3ByZXYgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgcHJldmFsZW5jZSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX2dlcl9wcmV2ICU+JSBtdXRhdGUocHJldl90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWtyZWlzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZShpKQoKcHJpbnQoZ2cpCn0KYGBgCgoKIyMjIFBsb3Qgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUKCmBgYHtyfQoKZGZfZ2VyX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyAoc2luZ2xlIHRpbGUpIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5wcmV2X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CmBgYAoKCmBgYHtyfQoKZGZfZ2VyX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3RfdGlsZXNfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyAoc2luZ2xlIHRpbGUpIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3RfdGlsZXNfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5wcmV2X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CmBgYAoKCgoKYGBge3J9CgpkZl9nZXJfc29jZGlzdCA8LSBkZl9nZXJfc29jZGlzdCAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgPSBzb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuLAogICAgICAgICBzb2NkaXN0X3RpbGVzID0gc29jZGlzdF90aWxlc19jbGVhbikgJT4lIAogIHNlbGVjdCgtbG9lc3MsIC1sb2Vzc18yLCAtc29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbiwgLXNvY2Rpc3RfdGlsZXNfY2xlYW4pCmBgYAoKCiMjIyBDb3JyZWxhdGlvbnMKYGBge3J9CgpkZl9nZXJfcHJldiAlPiUgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBzdW1tYXJpemVfaWYoaXMubnVtZXJpYywgbWVhbikgJT4lIAogIHNlbGVjdCgta3JlaXMsIC10aW1lKSAlPiUgCiAgY29yKHVzZT0ncGFpcndpc2UuY29tcGxldGUnKSAlPiUgCiAgcm91bmQoMykgJT4lIGFzLmRhdGEuZnJhbWUoKQoKZGZfZ2VyX3NvY2Rpc3QgJT4lIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4pICU+JSAKICBzZWxlY3QoLWtyZWlzLCAtdGltZSkgJT4lIAogIGNvcih1c2U9J3BhaXJ3aXNlLmNvbXBsZXRlJykgJT4lIAogIHJvdW5kKDMpICU+JSBhcy5kYXRhLmZyYW1lKCkKYGBgCgojIyBSZXNjYWxlIGRhdGEKYGBge3J9CgpsdmwyX3NjYWxlZCA8LSBkZl9nZXJfcHJldiAlPiUgCiAgZHBseXI6OnNlbGVjdCgtdGltZSwgLXJhdGVfZGF5LCAtZGF0ZSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1rcmVpcyksIHNjYWxlKQogIApsdmwxX3NjYWxlZCA8LSBkZl9nZXJfcHJldiAlPiUgc2VsZWN0KGtyZWlzLCB0aW1lLCByYXRlX2RheSkKCmRmX2dlcl9wcmV2X3NjYWxlZCA8LSBwbHlyOjpqb2luKGx2bDFfc2NhbGVkLCBsdmwyX3NjYWxlZCwgYnkgPSAna3JlaXMnKQoKZGZfZ2VyX3ByZXZfc2NhbGVkCgpgYGAKCmBgYHtyfQoKbHZsMl9zY2FsZWQgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIGRwbHlyOjpzZWxlY3QoLXRpbWUsIC1zb2NkaXN0X3NpbmdsZV90aWxlLCAtc29jZGlzdF90aWxlcywgLWRhdGUpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBtdXRhdGVfYXQodmFycygta3JlaXMpLCBzY2FsZSkKICAKbHZsMV9zY2FsZWQgPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIHNlbGVjdChrcmVpcywgdGltZSwgc29jZGlzdF9zaW5nbGVfdGlsZSwgc29jZGlzdF90aWxlcykKCmRmX2dlcl9zb2NkaXN0X3NjYWxlZCA8LSBwbHlyOjpqb2luKGx2bDFfc2NhbGVkLCBsdmwyX3NjYWxlZCwgYnkgPSAna3JlaXMnKQoKZGZfZ2VyX3NvY2Rpc3Rfc2NhbGVkCgpgYGAKCiMgUHJlZGljdCBQcmV2YWxlbmNlCiMjIyBFeHRyYWN0IGZpcnN0IGRheSBvZiBjb3ZpZCBvdXRicmVhawpgYGB7cn0KCiMgZ2V0IG9uc2V0IGRheQpkZl9nZXJfb25zZXRfcHJldiA8LSBkZl9nZXJfcHJldl9zY2FsZWQgJT4lIAogIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgbXV0YXRlKHJhdGVfY3MgPSBjdW1zdW0ocmF0ZV9kYXkpKSAlPiUgCiAgZmlsdGVyKHJhdGVfY3MgPiAwKSAlPiUKICBzdW1tYXJpemUob25zZXRfcHJldiA9IG1pbih0aW1lKSkKICAKIyBtZXJnZSB3aXRoIGNvdW50eSBkYXRhCmRmX2dlcl9vbnNldF9wcmV2IDwtIGRmX2dlcl9wcmV2X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGxlZnRfam9pbihkZl9nZXJfb25zZXRfcHJldiwgYnkgPSAna3JlaXMnKQoKIyBoYW5kbGUgY2Vuc29yZWQgZGF0YQpkZl9nZXJfb25zZXRfcHJldiA8LSBkZl9nZXJfb25zZXRfcHJldiAlPiUgCiAgbXV0YXRlKGV2ZW50ID0gaWZlbHNlKGlzLm5hKG9uc2V0X3ByZXYpLCAwLCAxKSkgJT4lIAogIG11dGF0ZShvbnNldF9wcmV2ID0gcmVwbGFjZV9uYShvbnNldF9wcmV2LCBhcy5udW1lcmljKGRpZmYocmFuZ2UoZGZfZ2VyX3ByZXYkZGF0ZSkpKSsxKSkKCmRmX2dlcl9vbnNldF9wcmV2CgpgYGAKCiMjIyBFeHRyYWN0IHNsb3BlcwpgYGB7cn0KCiMgY3V0IHRpbWUgc2VyaWVzIGJlZm9yZSBvbnNldApkZl9nZXJfcHJldl9zY2FsZWQgPC0gZGZfZ2VyX3ByZXZfc2NhbGVkICU+JSAKICBncm91cF9ieShrcmVpcykgJT4lIAogIG11dGF0ZShyYXRlX2NzID0gY3Vtc3VtKHJhdGVfZGF5KSkgJT4lIAogIGZpbHRlcihyYXRlX2NzID4gMCkgJT4lCiAgbXV0YXRlKHRpbWUgPSB0aW1lLW1pbih0aW1lKSsxKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHRpbWUgPD0gMzApICU+JQogIHNlbGVjdCgtcmF0ZV9jcykKCiMgZHJvcCBjb3VudGllcyB3aXRoIGxpdHRsZSBkYXRhCmRmX2dlcl9wcmV2X3NjYWxlZCA8LSBkZl9nZXJfcHJldl9zY2FsZWQgJT4lCiAgZ3JvdXBfYnkoa3JlaXMpICU+JQogIGZpbHRlcihuKCkgPT0gMzApICU+JQogIHVuZ3JvdXAoKQoKIyBsb2cgdHJhbnNmb3JtIHByZXZhbGVuY2UgZGF0YSAKZGZfZ2VyX3ByZXZfc2NhbGVkIDwtIGRmX2dlcl9wcmV2X3NjYWxlZCAlPiUgCiAgbXV0YXRlKHJhdGVfZGF5ID0gbG9nKHJhdGVfZGF5KSkKCiMgZXh0cmFjdCBzbG9wZSBwcmV2YWxlbmNlCmRmX2dlcl9zbG9wZV9wcmV2IDwtIGRmX2dlcl9wcmV2X3NjYWxlZCAlPiUgCiAgc3BsaXQoLiRrcmVpcykgJT4lIAogIG1hcCh+IGxtKHJhdGVfZGF5IH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lIAogIG1hcF9kYmwoJ3RpbWUnKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ2tyZWlzJykgJT4lIAogIHJlbmFtZShzbG9wZV9wcmV2ID0gJy4nKQoKIyBtZXJnZSB3aXRoIGNvdW50eSBkYXRhCmRmX2dlcl9zbG9wZV9wcmV2IDwtIGRmX2dlcl9vbnNldF9wcmV2ICU+JSAKICBpbm5lcl9qb2luKGRmX2dlcl9zbG9wZV9wcmV2LCBieSA9ICdrcmVpcycpICU+JQogIGRyb3BfbmEoKQoKIyBzdGFuZGFyZGl6ZSBzbG9wZXMKZGZfZ2VyX3Nsb3BlX3ByZXYgPC0gZGZfZ2VyX3Nsb3BlX3ByZXYgJT4lIAogIG11dGF0ZShzbG9wZV9wcmV2ID0gc2NhbGUoc2xvcGVfcHJldiksCiAgICAgICAgIG9uc2V0X3ByZXYgPSBzY2FsZShvbnNldF9wcmV2KSkKCmBgYAoKCiMjIyBFeHBsb3JlIGRpc3RyaWJ1dGlvbnMKYGBge3J9CgpkZl9nZXJfb25zZXRfcHJldiAlPiUgZ2dwbG90KGFlcyhvbnNldF9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbSgpCmRmX2dlcl9zbG9wZV9wcmV2ICU+JSBnZ3Bsb3QoYWVzKHNsb3BlX3ByZXYpKSArIGdlb21faGlzdG9ncmFtKCkKCmBgYAoKCiMjIFByZWRpY3QgQ09WSUQgb25zZXQgd2l0aCB0aW1lLXRvLWV2ZW50IHJlZ3Jlc3Npb24gCmBgYHtyfQoKIyBwcmVkaWN0IG9uc2V0IGZyb20gcGVyc29uYWxpdHkKY294X29uc2V0X3ByZXYgPC0gY294cGgoU3VydihvbnNldF9wcmV2LCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX29uc2V0X3ByZXYpCmNveF9vbnNldF9wcmV2ICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBvbnNldCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X29uc2V0X3ByZXZfY3RybCA8LSBjb3hwaChTdXJ2KG9uc2V0X3ByZXYsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX29uc2V0X3ByZXYpCmNveF9vbnNldF9wcmV2X2N0cmwgJT4lIHN1bW1hcnkoKQoKYGBgCgojIyBQcmVkaWN0IHByZXZhbGVuY2Ugc2xvcGVzIHdpdGggbGluZWFyIG1vZGVscwpgYGB7cn0KCiMgcHJlZGljdCBzbG9wZXMgZnJvbSBwZXJzb25hbGl0eQpsbV9zbG9wZV9wcmV2IDwtIGxtKHNsb3BlX3ByZXYgfiBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zbG9wZV9wcmV2KQpsbV9zbG9wZV9wcmV2ICU+JSBzdW1tYXJ5KCkKbG1fc2xvcGVfcHJldiAlPiUgY29uZmludChsZXZlbD0wLjkpCgojIHByZWRpY3Qgc2xvcGVzIGZyb20gcGVyc29uYWxpdHkgd2l0aCBjb250cm9scwpsbV9zbG9wZV9wcmV2X2N0cmwgPC0gbG0oc2xvcGVfcHJldiB+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2LAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zbG9wZV9wcmV2KQpsbV9zbG9wZV9wcmV2X2N0cmwgJT4lIHN1bW1hcnkoKQpsbV9zbG9wZV9wcmV2X2N0cmwgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKYGBgCgojIyMgQ1JGIHByZWRpY3Rpbmcgc2xvcGVzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9zbG9wZV9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3Nsb3BlX3ByZXYsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9zbG9wZV9wcmV2X3ZhcmltcCA8LSB2YXJpbXAoY3JmX3Nsb3BlX3ByZXYsIG5wZXJtID0gMSkKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wX2NvbmQgPC0gdmFyaW1wKGNyZl9zbG9wZV9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9zbG9wZV9wcmV2X3ZhcmltcApjcmZfc2xvcGVfcHJldl92YXJpbXAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wX2NvbmQKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wX2NvbmQgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCiMjIFByZWRpY3QgU29jaWFsIERpc3RhbmNpbmcKIyMjIENoYW5nZSBwb2ludCBhbmFseXNpcwpgYGB7cn0KCiMga2VlcCBvbmx5IGNvdW50aWVzIHdpdGggZnVsbCBkYXRhCmtyZWlzX2NvbXBsZXRlIDwtIGRmX2dlcl9zb2NkaXN0X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBzdW1tYXJpemUobiA9IG4oKSkgJT4lIAogIGZpbHRlcihuPT1tYXgoLiRuKSkgJT4lIAogIC4ka3JlaXMKCiMgcnVuIGNoYW5nZXBvaW50IGFuYWx5c2lzCmRmX2dlcl9zb2NkaXN0X2NwdF9yZXN1bHRzIDwtIGRmX2dlcl9zb2NkaXN0X3NjYWxlZCAlPiUgCiAgc2VsZWN0KGtyZWlzLCBzb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUKICBmaWx0ZXIoa3JlaXMgJWluJSBrcmVpc19jb21wbGV0ZSkgJT4lIAogIHNwbGl0KC4ka3JlaXMpICU+JQogIG1hcCh+IGNwdC5tZWFudmFyKGFzLnZlY3RvciguJHNvY2Rpc3Rfc2luZ2xlX3RpbGUpLAogICAgICAgICAgICAgICAgICAgICNwZW5hbHR5ID0gJ0FzeW1wdG90aWMnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgcGFyYW0uZXN0aW1hdGVzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgUT0xLAogICAgICAgICAgICAgICAgICAgIHRlc3Quc3RhdCA9ICdOb3JtYWwnKSkKCmRmX2dlcl9zb2NkaXN0X2NwdF9yZXN1bHRzXzIgPC0gZGZfZ2VyX3NvY2Rpc3Rfc2NhbGVkICU+JSAKICBzZWxlY3Qoa3JlaXMsIHNvY2Rpc3RfdGlsZXMpICU+JQogIGZpbHRlcihrcmVpcyAlaW4lIGtyZWlzX2NvbXBsZXRlKSAlPiUgCiAgc3BsaXQoLiRrcmVpcykgJT4lCiAgbWFwKH4gY3B0Lm1lYW52YXIoYXMudmVjdG9yKC4kc29jZGlzdF90aWxlcyksCiAgICAgICAgICAgICAgICAgICAgI3BlbmFsdHkgPSAnQXN5bXB0b3RpYycsCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICBwYXJhbS5lc3RpbWF0ZXM9VFJVRSwKICAgICAgICAgICAgICAgICAgICBRPTEsCiAgICAgICAgICAgICAgICAgICAgdGVzdC5zdGF0ID0gJ05vcm1hbCcpKQoKIyBjYWxjdWxhdGUgY2hhbmdlIHBvaW50CmRmX2dlcl9zb2NkaXN0X2NwdF9kYXkgPC0gZGZfZ2VyX3NvY2Rpc3RfY3B0X3Jlc3VsdHMgJT4lIAogIG1hcChjcHRzKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKGNwdF9kYXlfc29jZGlzdCA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdrcmVpcycpCgpkZl9nZXJfc29jZGlzdF9jcHRfZGF5XzIgPC0gZGZfZ2VyX3NvY2Rpc3RfY3B0X3Jlc3VsdHNfMiAlPiUgCiAgbWFwKGNwdHMpICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUoY3B0X2RheV9zb2NkaXN0XzIgPSAnLicpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigna3JlaXMnKQoKIyBjYWxjdWxhdGUgbWVhbiBkaWZmZXJlbmNlcwpkZl9nZXJfc29jZGlzdF9jcHRfbWVhbl9kaWZmIDwtIGRmX2dlcl9zb2NkaXN0X2NwdF9yZXN1bHRzICU+JSAKICBtYXAocGFyYW0uZXN0KSAlPiUgCiAgbWFwKH4gLiRtZWFuKSAlPiUgCiAgbWFwKH4gLlsyXSkgJT4lIAogIHVubGlzdCgpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJlbmFtZShtZWFuX2RpZmZfc29jZGlzdCA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdrcmVpcycpCgpkZl9nZXJfc29jZGlzdF9jcHRfbWVhbl9kaWZmXzIgPC0gZGZfZ2VyX3NvY2Rpc3RfY3B0X3Jlc3VsdHNfMiAlPiUgCiAgbWFwKHBhcmFtLmVzdCkgJT4lIAogIG1hcCh+IC4kbWVhbikgJT4lIAogIG1hcCh+IC0uWzJdKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKG1lYW5fZGlmZl9zb2NkaXN0XzIgPSAnLicpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigna3JlaXMnKQoKIyBjYWxjdWxhdGUgbWVhbnMgCmRmX2dlcl9zb2NkaXN0X21lYW4gPC0gZGZfZ2VyX3NvY2Rpc3Rfc2NhbGVkICU+JSAKICBncm91cF9ieShrcmVpcykgJT4lCiAgc3VtbWFyaXplKG1lYW5fc29jZGlzdCA9IG1lYW4oc29jZGlzdF9zaW5nbGVfdGlsZSkpCgpkZl9nZXJfc29jZGlzdF9tZWFuXzIgPC0gZGZfZ2VyX3NvY2Rpc3Rfc2NhbGVkICU+JSAKICBncm91cF9ieShrcmVpcykgJT4lCiAgc3VtbWFyaXplKG1lYW5fc29jZGlzdF8yID0gLW1lYW4oc29jZGlzdF90aWxlcykpCgojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfZ2VyX2NwdF9zb2NkaXN0IDwtIGRmX2dlcl9zb2NkaXN0X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtc29jZGlzdF9zaW5nbGVfdGlsZSwgLXNvY2Rpc3RfdGlsZXMpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGxlZnRfam9pbihkZl9nZXJfc29jZGlzdF9jcHRfZGF5LCBieT0na3JlaXMnKSAlPiUKICBsZWZ0X2pvaW4oZGZfZ2VyX3NvY2Rpc3RfY3B0X2RheV8yLCBieT0na3JlaXMnKSAlPiUKICBsZWZ0X2pvaW4oZGZfZ2VyX3NvY2Rpc3RfY3B0X21lYW5fZGlmZiwgYnk9J2tyZWlzJykgJT4lCiAgbGVmdF9qb2luKGRmX2dlcl9zb2NkaXN0X2NwdF9tZWFuX2RpZmZfMiwgYnk9J2tyZWlzJykgJT4lCiAgbGVmdF9qb2luKGRmX2dlcl9zb2NkaXN0X21lYW4sIGJ5PSdrcmVpcycpICU+JQogIGxlZnRfam9pbihkZl9nZXJfc29jZGlzdF9tZWFuXzIsIGJ5PSdrcmVpcycpICU+JQogIGxlZnRfam9pbihzZWxlY3QoZGZfZ2VyX29uc2V0X3ByZXYsIGtyZWlzLCBvbnNldF9wcmV2KSwgYnk9J2tyZWlzJykgJT4lCiAgbGVmdF9qb2luKHNlbGVjdChkZl9nZXJfc2xvcGVfcHJldiwga3JlaXMsIHNsb3BlX3ByZXYpLCBieT0na3JlaXMnKSAKCiMgc3RhbmRhcmRpemUgbWVhbi92YXIgZGlmZmVyZW5jZXMKZGZfZ2VyX2NwdF9zb2NkaXN0IDwtIGRmX2dlcl9jcHRfc29jZGlzdCAlPiUgCiAgbXV0YXRlKG1lYW5fZGlmZl9zb2NkaXN0ID0gc2NhbGUobWVhbl9kaWZmX3NvY2Rpc3QpLAogICAgICAgICBtZWFuX2RpZmZfc29jZGlzdF8yID0gc2NhbGUobWVhbl9kaWZmX3NvY2Rpc3RfMiksCiAgICAgICAgIG1lYW5fc29jZGlzdCA9IHNjYWxlKG1lYW5fc29jZGlzdCksCiAgICAgICAgIG1lYW5fc29jZGlzdF8yID0gc2NhbGUobWVhbl9zb2NkaXN0XzIpKQoKIyBoYW5kbGUgY2Vuc29yZWQgZGF0YQpkZl9nZXJfY3B0X3NvY2Rpc3QgPC0gZGZfZ2VyX2NwdF9zb2NkaXN0ICU+JSAKICBtdXRhdGUoY3B0X2RheV9zb2NkaXN0ID0gaWZlbHNlKGlzLm5hKGNwdF9kYXlfc29jZGlzdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyhkaWZmKHJhbmdlKGRmX2dlcl9zb2NkaXN0JGRhdGUpKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B0X2RheV9zb2NkaXN0KSkgJT4lIAogIG11dGF0ZShldmVudCA9IGlmZWxzZShjcHRfZGF5X3NvY2Rpc3QgPj0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyhkaWZmKHJhbmdlKGRmX2dlcl9zb2NkaXN0JGRhdGUpKSksIDAsIDEpKQoKYGBgCgpgYGB7cn0KZGZfZ2VyX2NwdF9zb2NkaXN0JGNwdF9kYXlfc29jZGlzdCAlPiUgaGlzdCgpCmRmX2dlcl9jcHRfc29jZGlzdCRtZWFuX2RpZmZfc29jZGlzdCAlPiUgaGlzdCgpCmRmX2dlcl9jcHRfc29jZGlzdCRtZWFuX3NvY2Rpc3QgJT4lIGhpc3QoKQoKCmRmX2dlcl9jcHRfc29jZGlzdCRjcHRfZGF5X3NvY2Rpc3RfMiAlPiUgaGlzdCgpCmRmX2dlcl9jcHRfc29jZGlzdCRtZWFuX2RpZmZfc29jZGlzdF8yICU+JSBoaXN0KCkKZGZfZ2VyX2NwdF9zb2NkaXN0JG1lYW5fc29jZGlzdF8yICU+JSBoaXN0KCkKCmBgYAoKYGBge3J9Cgpjb3IoZGZfZ2VyX2NwdF9zb2NkaXN0JG1lYW5fZGlmZl9zb2NkaXN0LCAKICAgIGRmX2dlcl9jcHRfc29jZGlzdCRtZWFuX3NvY2Rpc3QpCgpjb3IoZGZfZ2VyX2NwdF9zb2NkaXN0JG1lYW5fZGlmZl9zb2NkaXN0XzIsIAogICAgZGZfZ2VyX2NwdF9zb2NkaXN0JG1lYW5fc29jZGlzdF8yKQoKYGBgCgoKCmBgYHtyfQoKZm9yKGkgaW4gaGVhZChkZl9nZXJfc29jZGlzdF9jcHRfcmVzdWx0cywgNSkpewogIHBsb3QoaSkKfQoKYGBgCmBgYHtyfQoKZm9yKGkgaW4gaGVhZChkZl9nZXJfc29jZGlzdF9jcHRfcmVzdWx0c18yLCA1KSl7CiAgcGxvdChpKQp9CgpgYGAKCiMgUHJlZGljdGluZyBjaGFuZ2UgcG9pbnRzIHdpdGggdGltZS10by1ldmVudCByZWdyZXNzaW9uIApgYGB7cn0KCiMgcHJlZGljdCBoYXphcmQgZnJvbSBwZXJzb25hbGl0eQpjb3hfY3B0X3NvY2Rpc3QgPC0gY294cGgoU3VydihjcHRfZGF5X3NvY2Rpc3QsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX2NwdF9zb2NkaXN0KQpjb3hfY3B0X3NvY2Rpc3QgJT4lIHN1bW1hcnkoKQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X2NwdF9zb2NkaXN0X2N0cmwgPC0gY294cGgoU3VydihjcHRfZGF5X3NvY2Rpc3QsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29tZW4gKyBhY2FkZW1pY3MgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdXJpc21fYmVkcyArIGdkcCArIG1hbnVmYWN0ICsgYWlycG9ydCArIGFnZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BkZW5zICsgb25zZXRfcHJldiArIHNsb3BlX3ByZXYsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfY3B0X3NvY2Rpc3QpCmNveF9jcHRfc29jZGlzdF9jdHJsICU+JSBzdW1tYXJ5KCkKCmBgYAoKIyMjIExpbmVhciBtb2RlbHMgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2VzCmBgYHtyfQoKbG1fbWVhbmRpZmZfc29jZGlzdCA8LSBsbShtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfY3B0X3NvY2Rpc3QpCmxtX21lYW5kaWZmX3NvY2Rpc3QgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0ICU+JSBjb25maW50KGxldmVsPTAuOSkKCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybCA8LSBsbShtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucyArIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2LAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX2NwdF9zb2NkaXN0KQpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKYGBgCgojIyMgQ1JGIHByZWRpY3RpbmcgbWVhbiBkaWZmZXJlbmNlCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0IDwtIGNmb3Jlc3QobWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCAlPiUgZHJvcF9uYSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3QsIG5wZXJtID0gMSkKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQgPC0gdmFyaW1wKGNyZl9tZWFuZGlmZl9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgUHJlZGljdGluZyBjaGFuZ2UgcG9pbnRzIHdpdGggdGltZS10by1ldmVudCByZWdyZXNzaW9uIApgYGB7cn0KCiMgcHJlZGljdCBoYXphcmQgZnJvbSBwZXJzb25hbGl0eQpjb3hfY3B0X3NvY2Rpc3RfMiA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdF8yLCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCkKY294X2NwdF9zb2NkaXN0XzIgJT4lIHN1bW1hcnkoKQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X2NwdF9zb2NkaXN0X2N0cmxfMiA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdF8yLCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucyArIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2LAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX2NwdF9zb2NkaXN0KQpjb3hfY3B0X3NvY2Rpc3RfY3RybF8yICU+JSBzdW1tYXJ5KCkKCmBgYAoKIyMjIExpbmVhciBtb2RlbHMgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2VzCmBgYHtyfQoKbG1fbWVhbmRpZmZfc29jZGlzdF8yIDwtIGxtKG1lYW5fZGlmZl9zb2NkaXN0XzIgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX2NwdF9zb2NkaXN0KQpsbV9tZWFuZGlmZl9zb2NkaXN0XzIgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0XzIgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsXzIgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3RfMiB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbWVuICsgYWNhZGVtaWNzICsgYWZkICsgaG9zcGl0YWxfYmVkcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VyaXNtX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArIGFpcnBvcnQgKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucyArIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2LAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX2NwdF9zb2NkaXN0KQpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmxfMiAlPiUgc3VtbWFyeSgpCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybF8yICU+JSBjb25maW50KGxldmVsPTAuOSkKCmBgYAoKCiMjIyBDUkYgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2UKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX21lYW5kaWZmX3NvY2Rpc3RfMiA8LSBjZm9yZXN0KG1lYW5fZGlmZl9zb2NkaXN0XzIgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b21lbiArIGFjYWRlbWljcyArIGFmZCArIGhvc3BpdGFsX2JlZHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91cmlzbV9iZWRzICsgZ2RwICsgbWFudWZhY3QgKyBhaXJwb3J0ICsgYWdlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9jcHRfc29jZGlzdCAlPiUgZHJvcF9uYSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3RfMiwgbnBlcm0gPSAxKQpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3RfMiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXAKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCiMjIyBFeHBvcnQgZGF0YSAKYGBge3J9CgpnZXJfbGlzdF9yZXN1bHRzIDwtIGxpc3QoY294X29uc2V0X3ByZXYsIGNveF9vbnNldF9wcmV2X2N0cmwsIAogICAgIGxtX3Nsb3BlX3ByZXYsIGxtX3Nsb3BlX3ByZXZfY3RybCwgCiAgICAgY294X2NwdF9zb2NkaXN0LCBjb3hfY3B0X3NvY2Rpc3RfY3RybCwKICAgICBsbV9tZWFuZGlmZl9zb2NkaXN0LCBsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwsCiAgICAgY294X2NwdF9zb2NkaXN0XzIsIGNveF9jcHRfc29jZGlzdF9jdHJsXzIsCiAgICAgbG1fbWVhbmRpZmZfc29jZGlzdF8yLCBsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmxfMikKCnJlc3VsdHNfbmFtZXMgPC0gbGlzdCgnY294X29uc2V0X3ByZXYnLCAnY294X29uc2V0X3ByZXZfY3RybCcsIAogICAgICdsbV9zbG9wZV9wcmV2JywgJ2xtX3Nsb3BlX3ByZXZfY3RybCcsIAogICAgICdjb3hfY3B0X3NvY2Rpc3QnLCAnY294X2NwdF9zb2NkaXN0X2N0cmwnLCAKICAgICAnbG1fbWVhbmRpZmZfc29jZGlzdCcsICdsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwnLAogICAgICdjb3hfY3B0X3NvY2Rpc3RfMicsICdjb3hfY3B0X3NvY2Rpc3RfY3RybF8yJywKICAgICAnbG1fbWVhbmRpZmZfc29jZGlzdF8yJywgJ2xtX21lYW5kaWZmX3NvY2Rpc3RfY3RybF8yJykKCm5hbWVzKGdlcl9saXN0X3Jlc3VsdHMpIDwtIHJlc3VsdHNfbmFtZXMKCnNhdmUoZ2VyX2xpc3RfcmVzdWx0cywgZmlsZT0iZ2VyX2xpc3RfcmVzdWx0cy5SRGF0YSIpCgpgYGAKCmBgYHtyfQoKd3JpdGVfY3N2KGRmX2dlcl9zbG9wZV9wcmV2LCAnL1VzZXJzL2hwMjUwMC9Hb29nbGUgRHJpdmUvU1RVRFkvQ29sdW1iaWEvUmVzZWFyY2gvQ29yb25hL0RlbGl2ZXJ5L2RmX2dlcl9zbG9wZV9wcmV2LmNzdicpCndyaXRlX2NzdihkZl9nZXJfY3B0X3NvY2Rpc3QsICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGVsaXZlcnkvZGZfZ2VyX2NwdF9zb2NkaXN0LmNzdicpCgpgYGA=